const validateCerno = (rule, value, callback) => {
  if (!value) {
    callback(new Error('身份证号码为空'))
    return false
  }
  var area = {11: '北京', 12: '天津', 13: '河北', 14: '山西', 15: '内蒙古', 21: '辽宁', 22: '吉林', 23: '黑龙江', 31: '上海', 32: '江苏', 33: '浙江', 34: '安徽', 35: '福建', 36: '江西', 37: '山东', 41: '河南', 42: '湖北', 43: '湖南', 44: '广东', 45: '广西', 46: '海南', 50: '重庆', 51: '四川', 52: '贵州', 53: '云南', 54: '西藏', 61: '陕西', 62: '甘肃', 63: '青海', 64: '宁夏', 65: '新疆', 71: '台湾', 81: '香港', 82: '澳门', 91: '国外'}
  var ereg, Y, JYM
  var S, M
  var idcardArray = new Array(18)
  idcardArray = value
  // 地区检验
  if (area[parseInt(value.substr(0, 2))] == null && value.substr(0, 2)) {
    callback(new Error('不存在' + value.substr(0, 2) + '开头的身份证号码'))
    return false
  }
  // 身份号码位数及格式检验
  switch (value.length) {
    case 15:
      if ((parseInt(value.substr(6, 2)) + 1900) % 4 === 0 || ((parseInt(value.substr(6, 2)) + 1900) % 100 === 0 && (parseInt(value.substr(6, 2)) + 1900) % 4 === 0)) {
        ereg = /^[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}$/// 测试出生日期的合法性
      } else {
        ereg = /^[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}$/// 测试出生日期的合法性
      }

      if (ereg.test(value)) return true
      else {
        callback(new Error('不存在' + value.substr(0, 2) + '开头的身份证号码'))
        break
      }
    case 18:
      // 18位身份号码检测
      // 出生日期的合法性检查
      // 闰年月日:((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))
      // 平年月日:((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))
      if (parseInt(value.substr(6, 4)) % 4 === 0 || (parseInt(value.substr(6, 4)) % 100 === 0 && parseInt(value.substr(6, 4)) % 4 === 0)) {
        ereg = /^[1-9][0-9]{5}(19|20)[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}[0-9Xx]$/// 闰年出生日期的合法性正则表达式
      } else {
        ereg = /^[1-9][0-9]{5}(19|20)[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}[0-9Xx]$/// 平年出生日期的合法性正则表达式
      }
      if (ereg.test(value)) { // 测试出生日期的合法性
        // 计算校验位
        S = (parseInt(idcardArray[0]) + parseInt(idcardArray[10])) * 7 +
          (parseInt(idcardArray[1]) + parseInt(idcardArray[11])) * 9 +
          (parseInt(idcardArray[2]) + parseInt(idcardArray[12])) * 10 +
          (parseInt(idcardArray[3]) + parseInt(idcardArray[13])) * 5 +
          (parseInt(idcardArray[4]) + parseInt(idcardArray[14])) * 8 +
          (parseInt(idcardArray[5]) + parseInt(idcardArray[15])) * 4 +
          (parseInt(idcardArray[6]) + parseInt(idcardArray[16])) * 2 +
          parseInt(idcardArray[7]) * 1 +
          parseInt(idcardArray[8]) * 6 +
          parseInt(idcardArray[9]) * 3
        Y = S % 11
        M = 'F'
        JYM = '10X98765432'
        M = JYM.substr(Y, 1)// 判断校验位
        if (M === idcardArray[17]) {
          callback()
        } else { callback(new Error('输入正确身份证号码')) }
      } else { callback(new Error('输入正确身份证号码')) }
      break
    default:
      callback(new Error('输入正确身份证号码'))
      break
  }
}

// 定义phone验证全局变量
let validPhone = (rule, value, callback) => {
  const reg = /^1[3|4|5|7|8|9][0-9]\d{8}$/
  if (value && !reg.test(value)) {
    callback(new Error('请输入正确的11位手机号码'))
  } else {
    callback()
  }
}
// 定义统一社会信用代码
let validSocialCode = (rule, value, callback) => {
  const reg = /^[^_IOZSVa-z\W]{2}\d{6}[^_IOZSVa-z\W]{10}$/
  if (!value) {
    callback(new Error('请输入统一社会信用代码'))
  } else if (!reg.test(value)) {
    callback(new Error('统一社会信用代码格式错误'))
  } else {
    callback()
  }
}
// 中文
let vailChinese = (rule, value, callback) => {
  const reg = /^[\u4E00-\u9FA5（）()·]{1,50}$/
  // const reg = /^[\u4E00-\u9FA5]{1,6}$/;
  if (!value) {
    callback(new Error('必填'))
  } else if (!reg.test(value)) {
    callback(new Error('请输入中文'))
  } else {
    callback()
  }
}

// 地址
let vailAdress = (rule, value, callback) => {
  const reg = /^[\u4E00-\u9FA5（）()·0-9]{1,50}$/
  // const reg = /^[\u4E00-\u9FA5]{1,6}$/;
  if (!value) {
    callback(new Error('必填'))
  } else if (!reg.test(value)) {
    callback(new Error('请输入中文'))
  } else {
    callback()
  }
}
// 必填
let vailMust = (rule, value, callback) => {
  if (!value) {
    callback(new Error('必填'))
  } else {
    callback()
  }
}
// 金额
let vailMoney = (rule, value, callback) => {
  let reg = /(^[1-9]([0-9]+)?(\.[0-9]{1,6})?$)|(^[0-9]\.[0-9]([0-9])?$)/
  if (value && !reg.test(value)) {
    callback(new Error('请输入正确的金额数'))
  } else {
    callback()
  }
}
// 整数
let vailInteger = (rule, value, callback) => {
  let reg = /(^([0-9]+)?$)/
  if (!value) {
    callback(new Error('必填'))
  } else if (!reg.test(value)) {
    callback(new Error('请输入整数'))
  } else {
    callback()
  }
}
// 房产面积
let vailArea = (rule, value, callback) => {
  let reg = /(^[1-9]([0-9]+)?(\.[0-9]{1,3})?$)|(^[0-9]\.[0-9]([0-9])?$)/
  if (!value) {
    callback(new Error('必填'))
  } else if (!reg.test(value)) {
    callback(new Error('请输入正确的面积数'))
  } else {
    callback()
  }
}
export default {
  must: {
    validator: vailMust,
    trigger: 'blur',
    required: true
  },
  socialCode: {// 统一社会信用代码
    validator: validSocialCode,
    trigger: 'blur',
    required: true
  },
  chinese: {// 只能为中文
    validator: vailChinese,
    trigger: 'blur',
    required: true
  },
  cerno: {// 身份证号
    validator: validateCerno,
    trigger: 'blur',
    required: true
  },
  telphone: {// 移动电话
    validator: validPhone,
    trigger: 'blur'
  },
  money: {// 金额
    validator: vailMoney,
    trigger: 'blur'
  },
  int: {// 整数
    validator: vailInteger,
    trigger: 'blur',
    required: true
  },
  area: {// 房产面积
    validator: vailArea,
    trigger: 'blur',
    required: true
  },
  address: {// 地址
    validator: vailAdress,
    trigger: 'blur',
    required: true
  }
}
